Leetcode刷题笔记 您所在的位置:网站首页 旋转打印矩阵 leetcode Leetcode刷题笔记

Leetcode刷题笔记

2023-09-22 21:28| 来源: 网络整理| 查看: 265

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

Leetcode刷题笔记——剑指 Offer 29. 顺时针打印矩阵(简单) 题目描述方法一:模拟复杂度分析C++代码 方法二:按层模拟复杂度分析C++代码 方法三C++代码 参考链接

题目描述

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。

示例 1: 输入:matrix = [[1,2,3],[4,5,6],[7,8,9]] 输出:[1,2,3,6,9,8,7,4,5]

限制: 0 {0, 1}, {1, 0}, {0, -1}, {-1, 0}}; public: vector spiralOrder(vector& matrix) { if (matrix.size() == 0 || matrix[0].size() == 0) { return {}; } int rows = matrix.size(), columns = matrix[0].size(); vector visited(rows, vector(columns)); int total = rows * columns; vector order(total); int row = 0, column = 0; int directionIndex = 0; for (int i = 0; i directionIndex = (directionIndex + 1) % 4; } row += directions[directionIndex][0]; column += directions[directionIndex][1]; } return order; } }; 方法二:按层模拟

可以将矩阵看成若干层,首先打印最外层的元素,其次打印次外层的元素,直到打印最内层的元素。 对于每层,从左上方开始以顺时针的顺序遍历所有元素。假设当前层的左上角位于(top,left),右下角位于(bottom,right),按照如下顺序遍历当前层的元素。 1.从左到右遍历上侧元素,依次为(top,left) 到(top,right)。 2.从上到下遍历右侧元素,依次为 (top+1,right) 到 (bottom,right)。 3.如果 left if (matrix.size() == 0 || matrix[0].size() == 0) { return {}; } int rows = matrix.size(), columns = matrix[0].size(); vector order; int left = 0, right = columns - 1, top = 0, bottom = rows - 1; while (left order.push_back(matrix[top][column]); } for (int row = top + 1; row for (int column = right - 1; column > left; column--) { order.push_back(matrix[bottom][column]); } for (int row = bottom; row > top; row--) { order.push_back(matrix[row][left]); } } left++; right--; top++; bottom--; } return order; } }; 方法三

不需要记录已经走过的路径,所以执行用时和内存消耗都相对较小。 1.首先设定上下左右边界。 2.向右移动到最右,此时第一行因为已经使用过了,可以将其从图中删去,体现在代码中就是重新定义上边界。 3.判断若重新定义后,上下边界交错,表明螺旋矩阵遍历结束,跳出循环,返回答案。 4.若上下边界不交错,则遍历还未结束,接着向下向左向上移动,操作过程与第一,二步同理。 5.不断循环以上步骤,直到某两条边界交错,跳出循环,返回答案。

C++代码 class Solution { public: vector spiralOrder(vector& matrix) { vector ans; if(matrix.empty()) return ans; //若数组为空,直接返回答案 int u = 0; //赋值上下左右边界 int d = matrix.size() - 1; int l = 0; int r = matrix[0].size() - 1; while(true) { for(int i = l; i d) break; //重新设定上边界,若上边界大于下边界,则遍历遍历完成,下同 for(int i = u; i r) break; //重新设定左边界 } return ans; } }; 参考链接

【1】https://leetcode-cn.com/problems/shun-shi-zhen-da-yin-ju-zhen-lcof/solution/shun-shi-zhen-da-yin-ju-zhen-by-leetcode-solution/ 【2】https://leetcode-cn.com/problems/spiral-matrix/solution/cxiang-xi-ti-jie-by-youlookdeliciousc-3/



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有